package com.diy.sigmund.diygateway.config;

import com.diy.sigmund.diycommon.entity.constant.LogConstant;
import java.util.Collections;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;

/**
 * <pre code="class">
 * 跨域配置类
 * 因为浏览器的同源策略的原因，会导致与当前访问的域名不一致的资源无法正常访问，通过zuul服务网关对请求进行处理
 * 原文链接：https://blog.csdn.net/qq_43199016/article/details/104391086
 *
 * 跨域问题本质是浏览器地一种保护机制,它的初衷是为了保证用户的安全,防止恶意网站窃取数据.
 * 默认情况http可以省略端口80,https可以省略端口443
 * 跨域的三种情况:
 * 1.协议不同,如当前页面url:http://www.test.com,被请求页面url:https://www.test.com/index.html
 * 2.域名不同,
 * 如当前页面url:http://www.test.com,被请求页面url:https://www.baidu.com/index.html
 * 如当前页面url:http://www.test.com,被请求页面url:https://blog.test.com/index.html
 * 3.端口不同,如当前页面url:http://www.test.com:8080/,被请求页面url:https://www.test.com:7001/
 *
 * 解决跨域问题的本质是给响应头中加了一个 ("Access-Control-Allow-Origin","*") 响应头
 *     </pre>
 *
 * @author ylm-sigmund
 * @since 2021/10/20 16:28
 */
@Configuration
public class CorsConfig {

    private static final Logger log = LoggerFactory.getLogger(CorsConfig.class);

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        CorsConfiguration config = new CorsConfiguration();
        //允许跨域cookie
        config.setAllowCredentials(true);
        //设置原始域名
        config.setAllowedOrigins(Collections.singletonList("*"));
        config.setAllowedHeaders(Collections.singletonList("*"));
        config.setAllowedMethods(Collections.singletonList("*"));
        // config.addExposedHeader(CorsConfiguration.ALL);
        config.setMaxAge(300L);
        source.registerCorsConfiguration("/**", config);
        log.info(LogConstant.SPRING_LOG, "跨域配置初始化完成");
        return new CorsFilter(source);
    }
}
